package com.coderysh.rabbitmq.model.routing.topic;

import com.coderysh.rabbitmq.util.RabbitmqUtil;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;

import java.io.IOException;

/**
 * @author 姚书恒
 * @version 1.0
 * @email yaoshuheng@zjkeyou.com
 * @date 2021-10-26 14:05:05
 * @description: 生产者
 */
public class Provider {
    private static final String EXCHANGE_NAME = "exchange_topics";
    private static final String ROUTING_KEY = "user.save";

    /**
     * 通过连接获取通道
     *
     * @param channel
     * @param message
     */
    public void productionMessage(Channel channel, String message) {
        try {
            // 通道声明指定的交换机，并在交换机不存在时创建交换机
            // 参数1：交换机名称
            // 参数2：交换机类型,direct:路由模式
            channel.exchangeDeclare(EXCHANGE_NAME, "topic");
        } catch (IOException e) {
            e.printStackTrace();
        }

        // 发布消息
        // 参数1：交换机名称，没有可以不设置
        // 参数2：路由名称，路由Key
        // 参数3：传递消息的额外设置
        // 参数4：消息的具体内容
        try {
            channel.basicPublish(EXCHANGE_NAME, ROUTING_KEY, null, message.getBytes());
        } catch (IOException e) {
            e.printStackTrace();
        }

        Connection connection = channel.getConnection();
        // 关闭通道
        RabbitmqUtil.closeChannel(channel);

        // 关闭连接
        RabbitmqUtil.closeConnection(connection);
    }

    /**
     * 生产者生产消息
     */
    public void sendMessage(String message) {
        this.productionMessage(RabbitmqUtil.createChannel(RabbitmqUtil.connection()), message);
        System.out.println("发送内容完成:" + message);
    }

    public static void main(String[] args) {
        Provider provider = new Provider();
        provider.sendMessage("这里是Topics动态路由模型,routingKey：" + ROUTING_KEY);
    }
}
